package utils

import (
	"database/sql"
	"errors"
	"gitee.com/tainanleya/go_generate_tool/log"
)

type PageUtils struct {
	Sql        *string // 原搜索sql
	Args       []any   // sql参数
	Total      int64   // 总数
	PageSize   int     // 页大小
	PageNumber int     // 哪一页
	List       any     // 数据
	DB         *sql.DB // 所使用的数据库
}

// PageExec 传入搜索语句 返回一个PageUtils
func (p *PageUtils) PageExec(result func(rows *sql.Rows) (any, error)) error {
	if p.Sql == nil {
		return errors.New("sql not can is nil")
	}
	if p.PageNumber == 0 {
		p.PageNumber = 1
	}
	if p.PageSize == 0 {
		p.PageSize = 20
	}
	// 先将sql总数算出
	countSql := "select count(1) from (" + *p.Sql + ") as temp_count"
	if log.IsDebug() {
		log.Debugf("PageExec.sql:\n\t%s\n\t\targs:%+v", countSql, p.Args)
	}
	row := p.DB.QueryRow(countSql, p.Args...)
	var sqlCount sql.NullInt64
	err := row.Scan(&sqlCount)
	if err != nil {
		log.Error(err)
		return err
	}
	if !sqlCount.Valid {
		return errors.New("page total not Valid,sql failed")
	}
	p.Total = sqlCount.Int64
	// 算出当前sql 分页之后的rows
	currentSize := p.PageSize * (p.PageNumber - 1)
	limitSql := *p.Sql + " limit ?,?"

	p.Args = append(p.Args, currentSize)
	p.Args = append(p.Args, p.PageSize)

	if log.IsDebug() {
		log.Debugf("PageExec.sql:\n\t%s\n\t\targs:%+v", limitSql, p.Args)
	}

	rows, err := p.DB.Query(limitSql, p.Args...)
	if err != nil {
		log.Error(err)
		return err
	}
	defer rows.Close()

	// 将rows给函数result调用 让外界来进行执行
	data, err := result(rows)
	if err != nil {
		return err
	}
	// result返回一个data数据 将数据赋值到List 最后返回
	p.List = data
	return nil
}
